/*!
 * 
 * DataTables 插件工具。
 * 
 * @author ChenYong
 * @date 2016-02-05
 * 
 */

(function ($) {
    //--------------------[封闭的方法定义]--------------------/
    /**
     *
     * 改变 DataTables 全选复选框的状态。
     *
     * @param dataTable DataTables 实例
     *
     */
    var changDataTablesAllCheckboxStatus = function (dataTable) {
        // 获取全选复选框
        var $allCheckbox = $(dataTable.table().header()).find("tr th input[type='checkbox']");
        // 获取所有复选框
        var $checkboxs = $(dataTable.table().body()).find("tr td input[type='checkbox']");

        // 如果每行都没有复选框，那么取消全选
        if ($checkboxs.length <= 0) {
            // 让全选复选框不选中
            $allCheckbox.prop("checked", false);

            // 立即结束方法
            return;
        }

        // 被选中的复选框个数
        var checkedCount = 0;
        for (var i = 0; i < $checkboxs.length; i++) {
            if ($checkboxs.get(i).checked) {
                checkedCount++;
            }
        }

        // 如果所有复选框全被选中了
        if (checkedCount === $checkboxs.length) {
            // 让全选复选框选中
            $allCheckbox.prop("checked", true);

            // 如果所有复选框未被全选中
        } else {
            // 让全选复选框不选中
            $allCheckbox.prop("checked", false);
        }
    };
    //--------------------[/封闭的方法定义]--------------------/


    /**
     *
     * 我的 DataTables。
     *
     */
    $.fn.myDataTable = function (options) {
        // 请求  Url
        options.url = ($.isBlank(options.url) ? "404" : (options.url));
        // 请求方式
        options.type = ($.isBlank(options.type) ? "get" : options.type);
        // 是否异步：true-是；false-否
        options.async = (($.type(options.async) === "boolean") ? options.async : true);
        // 是否开启排序功能，默认：开启
        options.bSort = (($.type(options.bSort) === "boolean") ? options.bSort : true);
        // 是否开启页脚信息，默认：开启
        options.bInfo = (($.type(options.bInfo) === "boolean") ? options.bInfo : true);
        // 是否开启过滤功能，默认：不开启
        options.bFilter = (($.type(options.bFilter) === "boolean") ? options.bFilter : false);
        // 是否开启销毁表格，默认：不开启
        options.bDestroy = (($.type(options.bDestroy) === "boolean") ? options.bDestroy : false);
        // 返回数据的类型，默认为 JSON
        options.dataType = ($.isBlank(options.dataType) ? "json" : options.dataType);
        // 是否开启水平滚动条，默认：不开启
        options.sScrollX = (($.type(options.sScrollX) === "boolean") ? options.sScrollX : false);
        // 是否开启水平滚动条，默认：不开启
        options.sScrollY = ($.isBlank(options.sScrollY) ? "" : options.sScrollY);
        // 搜索按钮
        options.searchBtn = ($.is_jQueryObj(options.searchBtn) ? options.searchBtn : null);
        // 搜索按钮的信息
        options.searchMsg = ($.isBlank(options.searchMsg) ? "正在搜索" : options.searchMsg);
        // 列
        options.aoColumns = ($.isArray(options.aoColumns) ? options.aoColumns : []);
        // 多列排序，默认：不排序
        options.aaSorting = ($.isArray(options.aaSorting) ? options.aaSorting : []);
        // 是否开启分页功能，默认：开启
        options.bPaginate = (($.type(options.bPaginate) === "boolean") ? options.bPaginate : true);
        // 是否开启自动设置宽度，默认：开启
        options.bAutoWidth = (($.type(options.bAutoWidth) === "boolean") ? options.bAutoWidth : true);
        // 是否开启保存表格状态功能，默认：不开启
        options.bStateSave = (($.type(options.bStateSave) === "boolean") ? options.bStateSave : false);
        // 是否开启服务器处理数据源，默认：开启
        options.bServerSide = (($.type(options.bServerSide) === "boolean") ? options.bServerSide : true);
        // 是否开启等待提示，默认：开启
        options.bProcessing = (($.type(options.bProcessing) === "boolean") ? options.bProcessing : true);
        // 每页记录数
        options.aLengthMenu = ($.isArray(options.aLengthMenu) ? options.aLengthMenu : [10, 25, 50, 100]);
        // 列的默认定义
        options.aoColumnDefs = ($.isArray(options.aoColumnDefs) ? options.aoColumnDefs : []);
        // 表格内容的宽度，与 options.sScrollX 有关，默认：空
        options.sScrollXInner = ($.isBlank(options.sScrollXInner) ? "" : options.sScrollXInner);
        // 是否开启每页大小下拉框，默认：开启
        options.bLengthChange = (($.type(options.bLengthChange) === "boolean") ? options.bLengthChange : true);
        // 是否开启当显示的数据不足以支撑表格的默认的高度时，执着地显示显示真实高度，默认：开启
        options.bScrollCollapse = (($.type(options.bScrollCollapse) === "boolean") ? options.bScrollCollapse : true);
        // 开始记录数，用于直接跳转至某一页
        options.iDisplayStart = ($.isNumber(options.iDisplayStart) ? options.iDisplayStart : 0);
        // 每页记录数
        options.iDisplayLength = ($.isNumber(options.iDisplayLength) ? ((options.iDisplayLength <= 0) ? options.aLengthMenu[0] : options.iDisplayLength) : options.aLengthMenu[0]);

        // 当前数据表的 jQuery 对象
        var $this = this;
        // 加载等待框
        var $processing = null;
        // DataTable 对象
        var myDataTable = null;
        // DataTable 的执行标记：true-可以执行；false-不可以执行，因为上一次还未执行完毕，你个弄个啥？
        var dataTableFlag = true;


        myDataTable = $this.DataTable({
            bSort: options.bSort,
            bInfo: options.bInfo,
            bFilter: options.bFilter,
            bDestroy: options.bDestroy,
            sScrollX: options.sScrollX,
            sScrollY: options.sScrollY,
            aoColumns: options.aoColumns,
            aaSorting: options.aaSorting,
            bPaginate: options.bPaginate,
            bAutoWidth: options.bAutoWidth,
            bStateSave: options.bStateSave,
            bServerSide: options.bServerSide,
            sAjaxSource: options.url,
            bProcessing: options.bProcessing,
            aLengthMenu: options.aLengthMenu,
            aoColumnDefs: options.aoColumnDefs,
            sScrollXInner: options.sScrollXInner,
            bLengthChange: options.bLengthChange,
            bScrollCollapse: options.bScrollCollapse,
            iDisplayStart: options.iDisplayStart,
            iDisplayLength: options.iDisplayLength,
            sPaginationType: "full_numbers",
            oLanguage: {
                sInfo: "第<span class='datatables-sinfo-1'>_START_</span>至<span class='datatables-sinfo-1'>_END_</span>条，共<span class='datatables-sinfo-2'>_TOTAL_</span>&nbsp;&nbsp;条",
                sSearch: "搜索：",
                sInfoEmpty: "第<span class='datatables-sinfo-1'>0</span>至<span class='datatables-sinfo-1'>0</span>条，共<span class='datatables-sinfo-2'>0</span>&nbsp;&nbsp;条",
                sLengthMenu: "每页 _MENU_ 条",
                sProcessing: "<i class='fa fa-spinner fa-spin'></i>正在加载…",
                sEmptyTable: "暂无数据",
                sZeroRecords: "暂无数据",
                oPaginate: {
                    sFirst: "首页",
                    sPrevious: "上一页 ",
                    sNext: "下一页 ",
                    sLast: "尾页 "
                }
            },
            fnServerData: function (sAjaxSource, ajaxData, fnCallback, oSettings) {
                if (dataTableFlag) {
                    // 加入自己的参数
                    if ($.isNotNull(myDataTable) && $.isObject(myDataTable.myAjaxData)) {
                        for (var name in myDataTable.myAjaxData) {
                            ajaxData.push({
                                "name": name,
                                "value": myDataTable.myAjaxData[name]
                            });
                        }
                    }

                    // 发 ajax 获取数据
                    oSettings.jqXHR = $.myAjax({
                        url: sAjaxSource,
                        type: options.type,
                        data: ajaxData,
                        async: options.async,
                        dataType: options.dataType,
                        submitBtn: options.searchBtn,
                        submitMsg: options.searchMsg,
                        beforeSendFn: function () {
                            dataTableFlag = false;

                            if ($.isFunction(options.beforeSendFn)) {
                                options.beforeSendFn();
                            }
                        },
                        completeFn: function () {
                            dataTableFlag = true;

                            if ($.is_jQueryObj($processing)) {
                                $processing.css("display", "none");
                            }

                            if ($.isFunction(options.completeFn)) {
                                options.completeFn();
                            }
                        },
                        successFn: function (data, textStatus, jqXhr) {
                            // 取消全选
                            $("div.dataTables_scrollHead").find("table thead tr th input[type='checkbox']").eq(0).prop("checked", false);

                            fnCallback(data.result);

                            if (myDataTable != null) {
                                // 给表格身体的 td 添加强制换行的样式
                                $(myDataTable.table().body()).find("td").css({
                                    "word-wrap": "break-word",
                                    "word-break": "break-all"
                                });
                            }
                        }
                    });
                }
            }
        });

        $processing = $("#" + $this.attr("id") + "_processing");

        // 将“正在加载…”等待框浮动在表格的上面
        $processing.css("z-index", "10");

        /**************************************************[表格事件驱动]**************************************************/
        // 点击全选复选框
        $(myDataTable.table().header()).on("click", "tr th input[type='checkbox']", function () {
            // 是否选中
            var isChecked = this.checked;

            // 遍历数据表中所有行
            $(myDataTable.table().body()).find("tr").each(function () {
                // 获取每一行
                var $row = $(this);
                // 获取每一行的复选框
                var $checkbox = $row.find("input[type='checkbox']");

                // 如果当前行有复选框
                if ($checkbox.length > 0) {
                    if (isChecked) {
                        $row.addClass("selected");
                        $checkbox.eq(0).prop("checked", true);
                    } else {
                        $row.removeClass("selected");
                        $checkbox.eq(0).prop("checked", false);
                    }
                }
            });
        });

        // 点击行，有复选框的，才能选中/取消选中一行
        /*
         $(myDataTable.table().body()).on("click", "tr", function () {
         // 获取当前行
         var $row = $(this);
         // 获取当前行的复选框
         var $checkbox = $row.find("td input[type='checkbox']");

         // 如果当前行有复选框
         if ($checkbox.length === 1) {
         // 选中/取消选中
         $row.toggleClass("selected");

         // 如果行被选中
         if ($row.is(".selected")) {
         $checkbox.prop("checked", true);

         // 如果行没被选中
         } else {
         $checkbox.prop("checked", false);
         }
         }

         changDataTablesAllCheckboxStatus(myDataTable);
         });
         */

        // 点击每行复选框，当复选框选中/取消选中时，对应的行选中/取消选中
        $(myDataTable.table().body()).on("click", "tr td input[type='checkbox']", function () {
            // 获取当前复选框所在的行
            var $row = $(this).closest("tr");

            // 是否选中
            if (this.checked) {
                $row.addClass("selected");
            } else {
                $row.removeClass("selected");
            }

            changDataTablesAllCheckboxStatus(myDataTable);
        });
        /**************************************************[/表格事件驱动]**************************************************/

        return myDataTable;
    };
})(jQuery);